/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.domain.ubicacion;

import com.model.dao.orm.Key;
import com.model.dao.mapping.Enaho01;
import com.model.domain.enaho.registro.Capitulo600Resumen;
import com.model.domain.persona.Hogar;
import com.model.domain.persona.HogarXmlTransferido;
import com.model.domain.proceso.envio.carga.EstadoCarga;
import com.model.domain.proceso.envio.carga.TipoCarga;
import com.model.domain.proceso.envio.subida.LogXmlTransferido;
import com.model.domain.proceso.envio.subida.xml.CampoXmlEnaho;
import com.model.domain.proceso.envio.subida.xml.RegistroXmlHogar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import util.file.xml.TablaXml;
import util.patron.command.Command2;

/**
 *
 * @author Rdelacruz
 */
public class ViviendaXmlTransferido
//implements Key
{
    private LogXmlTransferido logXmlTransferido;//aqui esta ArchivoXmlEnaho
    private int ordenEnvio;
    private String conglomerado;
    private String vivienda;  
    private Boolean existeEnXml;
    
    private TipoCarga tipoUltimaCarga;
    private EstadoCarga resultadoUltimaCarga;//Almacena solo la ultima carga de la vivienda 
                            //NOTA: si se quiere el historial de cargas habria 
                            //que crear la tabla Envios_contro_vivienda
    
    private List<HogarXmlTransferido> hogares;
  
    /*
    @Override
    public String getKey() {
        return logXmlTransferido.getOperacionSubida().getArchivo().getNombre();
    }*/
    
    public void procesarNroMiembros(CampoXmlEnaho archivoXml) throws Exception {
        if(hogares==null)
            throw new Exception("Falta establecer el atributo 'hogares'");
        
        TablaXml<RegistroXmlHogar> txml = new TablaXml<RegistroXmlHogar>();
        archivoXml.parsear(txml, Enaho01.CAP_200.getTabla());

        //inicializando nro de miembros
        for(HogarXmlTransferido hxml : hogares) {
            hxml.getHogar().setNroMiembros(0);
        }

        //contando nro de miembros de cada hogar
        for(RegistroXmlHogar reg: txml.getRegistros()) {
            HogarXmlTransferido hxml = getHogar(reg.getCodigoHogar());
            Hogar h = hxml.getHogar();
            h.setNroMiembros( h.getNroMiembros() + 1 );
        }
    }
    
    public void procesarCapitulos600(CampoXmlEnaho archivoXml) throws Exception {
        if(hogares==null)
            throw new Exception("Falta establecer el atributo 'hogares'");
        
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_601.getTabla(),"P601b", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap601(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_602.getTabla(),"P602", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap602(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_602A.getTabla(),"p602a1", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap602A(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_603.getTabla(),"P603", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap603(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_604.getTabla(),"P604", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap604(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_605.getTabla(),"P605", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap605(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_606.getTabla(),"P606", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap606(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_606D.getTabla(),"p606d", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap606D(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_607.getTabla(),"p607", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap607(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_609.getTabla(),"p609", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap609(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_610.getTabla(),"p610", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap610(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_611.getTabla(),"p611", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap611(obj2);
            }
        });
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_612.getTabla(),"p612", new Command2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void execute(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap612(obj2);
            }
        });
        
        /*
        procesarCapitulo600Resumen(archivoXml,Enaho01.CAP_612A.getTabla(),"p606d", new Operacion2<HogarXmlTransferido, Capitulo600Resumen>() {
            @Override
            public void operar(HogarXmlTransferido obj1, Capitulo600Resumen obj2) {
                obj1.setCap612A(obj2);
            }
        });
        */
    }
    
    private void procesarCapitulo600Resumen(CampoXmlEnaho archivoXml, 
            String tabla, 
            String columna, 
            Command2<HogarXmlTransferido,Capitulo600Resumen> opEstablecerCapitulo) throws Exception {
        
        Map<String,Capitulo600Resumen> map = new HashMap<String,Capitulo600Resumen>();  
        
        //Inicializando        
        for(HogarXmlTransferido hxml : hogares) {            
            Capitulo600Resumen cap = new Capitulo600Resumen();
            cap.setNroFilasNo(0);
            cap.setNroFilasSi(0);            
            map.put(hxml.getHogar().getCodigo()+"", cap);
            opEstablecerCapitulo.execute(hxml,cap);
        }
        
        //Contando
        TablaXml<RegistroXmlHogar> txml = new TablaXml<RegistroXmlHogar>();
        archivoXml.parsear(txml, tabla);
        for(RegistroXmlHogar r : txml.getRegistros()) {
            Capitulo600Resumen cap = map.get(r.getCodigoHogar());            
            String v = r.getValorString(columna);
            if(v.equals("1")) {                
                cap.setNroFilasSi(cap.getNroFilasSi() + 1);
            }
            else if(v.equals("2")) {
                cap.setNroFilasNo(cap.getNroFilasNo() + 1);
            }
        }       
    }
    
    public HogarXmlTransferido getHogar(String codigoHogar) {
        if(hogares!=null) {            
            for(HogarXmlTransferido h: hogares) { 
                Integer cod = Integer.parseInt( codigoHogar );
                if(h.getHogar().getCodigo().equals(cod ))
                    return h;
            }
        }
        return null;
    }

    public String getConglomerado() {
        return conglomerado;
    }

    public void setConglomerado(String conglomerado) {
        this.conglomerado = conglomerado;
    }

    public String getVivienda() {
        return vivienda;
    }

    public void setVivienda(String vivienda) {
        this.vivienda = vivienda;
    }

    public LogXmlTransferido getLogXmlTransferido() {
        return logXmlTransferido;
    }

    public void setLogXmlTransferido(LogXmlTransferido logXmlTransferido) {
        this.logXmlTransferido = logXmlTransferido;
    }

   

    public List<HogarXmlTransferido> getHogares() {
        return hogares;
    }

    public void setHogares(List<HogarXmlTransferido> hogares) {
        this.hogares = hogares;
    }    

    public EstadoCarga getResultadoUltimaCarga() {
        return resultadoUltimaCarga;
    }

    public void setResultadoUltimaCarga(EstadoCarga resultadoUltimaCarga) {
        this.resultadoUltimaCarga = resultadoUltimaCarga;
    }

    

    public Boolean isExisteEnXml() {
        return existeEnXml;
    }

    public void setExisteEnXml(Boolean existeEnXml) {
        this.existeEnXml = existeEnXml;
    }

    public TipoCarga getTipoUltimaCarga() {
        return tipoUltimaCarga;
    }

    public void setTipoUltimaCarga(TipoCarga tipoUltimaCarga) {
        this.tipoUltimaCarga = tipoUltimaCarga;
    }

    public int getOrdenEnvio() {
        return ordenEnvio;
    }

    public void setOrdenEnvio(int ordenEnvio) {
        this.ordenEnvio = ordenEnvio;
    }


 

    
    
}
